package com.example.springboottest.example.httpclient.pool;

import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.protocol.HttpContext;

import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException;

/**
 * RetryHandler 实现了 HttpRequestRe Handler 接口，它用于实现网络请求的重试机
 * 制。在这里， HttpClient 重试的次数 ，属于 Hard Code，更合理的做法是将重试次数放在配置
 * 文件中，程序使用 读取配置文件的信息。
 */
public class RetryHandler implements HttpRequestRetryHandler {
    @Override
    public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
        if (executionCount >= 3) {//如果已经重试了3 次，就放弃
            return false;
        }

        if (exception instanceof NoHttpResponseException) {//如采服务器丢掉了连接，那么就重试
            return true;
        }

        if (exception instanceof SSLHandshakeException) { //不妥重试 SSL 握手异常
            return false;
        }

        if (exception instanceof InterruptedIOException) { //超时
            return true;
        }
        return false;
    }
}
